package pe.gob.mpfn.controller;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.el.ELContext;
import javax.el.ExpressionFactory;
import javax.faces.application.Application;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.component.html.HtmlOutputText;
import javax.faces.component.html.HtmlPanelGrid;
import javax.faces.context.FacesContext;
import javax.faces.convert.DateTimeConverter;
import javax.faces.validator.LengthValidator;
import org.primefaces.component.autocomplete.AutoComplete;
import org.primefaces.component.calendar.Calendar;
import org.primefaces.component.inputtextarea.InputTextarea;
import org.primefaces.component.message.Message;
import org.primefaces.context.RequestContext;
import org.primefaces.event.CloseEvent;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Configurable;
import org.springframework.roo.addon.jsf.managedbean.RooJsfManagedBean;
import org.springframework.roo.addon.serializable.RooSerializable;
import pe.gob.mpfn.controller.converter.TablaMaestraConverter;
import pe.gob.mpfn.model.Diligencia;
import pe.gob.mpfn.model.Expediente;
import pe.gob.mpfn.model.ExpedienteParte;
import pe.gob.mpfn.model.Informe;
import pe.gob.mpfn.model.TablaMaestra;
import pe.gob.mpfn.service.ExpedienteService;
import pe.gob.mpfn.service.TablaMaestraService;

@Configurable
@ManagedBean(name = "expedienteBean")
@SessionScoped
@RooSerializable
@RooJsfManagedBean(entity = Expediente.class, beanName = "expedienteBean")
public class ExpedienteBean implements Serializable  {

	private static final long serialVersionUID = 1L;

	@Autowired
    ExpedienteService expedienteService;

	@Autowired
    TablaMaestraService tablaMaestraService;

	private String name = "Expedientes";

	private Expediente expediente;

	private List<Expediente> allExpedientes;

	private boolean dataVisible = false;

	private List<String> columns;

	private HtmlPanelGrid createPanelGrid;

	private HtmlPanelGrid editPanelGrid;

	private HtmlPanelGrid viewPanelGrid;

	private boolean createDialogVisible = false;

	private List<Diligencia> selectedDiligencias;

	private List<ExpedienteParte> selectedExpedientePartes;

	private List<Informe> selectedInformes;

	@PostConstruct
    public void init() {
        columns = new ArrayList<String>();
        columns.add("strLugarSuceso");
        columns.add("datFechaRegistro");
        columns.add("datFechaSuceso");
    }

	public String getName() {
        return name;
    }

	public List<String> getColumns() {
        return columns;
    }

	public List<Expediente> getAllExpedientes() {
        return allExpedientes;
    }

	public void setAllExpedientes(List<Expediente> allExpedientes) {
        this.allExpedientes = allExpedientes;
    }

	public String findAllExpedientes() {
        allExpedientes = expedienteService.findAllExpedientes();
        dataVisible = !allExpedientes.isEmpty();
        return null;
    }

	public boolean isDataVisible() {
        return dataVisible;
    }

	public void setDataVisible(boolean dataVisible) {
        this.dataVisible = dataVisible;
    }

	public HtmlPanelGrid getCreatePanelGrid() {
        if (createPanelGrid == null) {
            createPanelGrid = populateCreatePanel();
        }
        return createPanelGrid;
    }

	public void setCreatePanelGrid(HtmlPanelGrid createPanelGrid) {
        this.createPanelGrid = createPanelGrid;
    }

	public HtmlPanelGrid getEditPanelGrid() {
        if (editPanelGrid == null) {
            editPanelGrid = populateEditPanel();
        }
        return editPanelGrid;
    }

	public void setEditPanelGrid(HtmlPanelGrid editPanelGrid) {
        this.editPanelGrid = editPanelGrid;
    }

	public HtmlPanelGrid getViewPanelGrid() {
        if (viewPanelGrid == null) {
            viewPanelGrid = populateViewPanel();
        }
        return viewPanelGrid;
    }

	public void setViewPanelGrid(HtmlPanelGrid viewPanelGrid) {
        this.viewPanelGrid = viewPanelGrid;
    }

	public HtmlPanelGrid populateCreatePanel() {
        FacesContext facesContext = FacesContext.getCurrentInstance();
        Application application = facesContext.getApplication();
        ExpressionFactory expressionFactory = application.getExpressionFactory();
        ELContext elContext = facesContext.getELContext();
        
        HtmlPanelGrid htmlPanelGrid = (HtmlPanelGrid) application.createComponent(HtmlPanelGrid.COMPONENT_TYPE);
        
        HtmlOutputText diligenciasCreateOutput = (HtmlOutputText) application.createComponent(HtmlOutputText.COMPONENT_TYPE);
        diligenciasCreateOutput.setId("diligenciasCreateOutput");
        diligenciasCreateOutput.setValue("Diligencias:   ");
        htmlPanelGrid.getChildren().add(diligenciasCreateOutput);
        
        HtmlOutputText diligenciasCreateInput = (HtmlOutputText) application.createComponent(HtmlOutputText.COMPONENT_TYPE);
        diligenciasCreateInput.setId("diligenciasCreateInput");
        diligenciasCreateInput.setValue("This relationship is managed from the Diligencia side");
        htmlPanelGrid.getChildren().add(diligenciasCreateInput);
        
        Message diligenciasCreateInputMessage = (Message) application.createComponent(Message.COMPONENT_TYPE);
        diligenciasCreateInputMessage.setId("diligenciasCreateInputMessage");
        diligenciasCreateInputMessage.setFor("diligenciasCreateInput");
        diligenciasCreateInputMessage.setDisplay("icon");
        htmlPanelGrid.getChildren().add(diligenciasCreateInputMessage);
        
        HtmlOutputText expedientePartesCreateOutput = (HtmlOutputText) application.createComponent(HtmlOutputText.COMPONENT_TYPE);
        expedientePartesCreateOutput.setId("expedientePartesCreateOutput");
        expedientePartesCreateOutput.setValue("Expediente Partes:   ");
        htmlPanelGrid.getChildren().add(expedientePartesCreateOutput);
        
        HtmlOutputText expedientePartesCreateInput = (HtmlOutputText) application.createComponent(HtmlOutputText.COMPONENT_TYPE);
        expedientePartesCreateInput.setId("expedientePartesCreateInput");
        expedientePartesCreateInput.setValue("This relationship is managed from the ExpedienteParte side");
        htmlPanelGrid.getChildren().add(expedientePartesCreateInput);
        
        Message expedientePartesCreateInputMessage = (Message) application.createComponent(Message.COMPONENT_TYPE);
        expedientePartesCreateInputMessage.setId("expedientePartesCreateInputMessage");
        expedientePartesCreateInputMessage.setFor("expedientePartesCreateInput");
        expedientePartesCreateInputMessage.setDisplay("icon");
        htmlPanelGrid.getChildren().add(expedientePartesCreateInputMessage);
        
        HtmlOutputText informesCreateOutput = (HtmlOutputText) application.createComponent(HtmlOutputText.COMPONENT_TYPE);
        informesCreateOutput.setId("informesCreateOutput");
        informesCreateOutput.setValue("Informes:   ");
        htmlPanelGrid.getChildren().add(informesCreateOutput);
        
        HtmlOutputText informesCreateInput = (HtmlOutputText) application.createComponent(HtmlOutputText.COMPONENT_TYPE);
        informesCreateInput.setId("informesCreateInput");
        informesCreateInput.setValue("This relationship is managed from the Informe side");
        htmlPanelGrid.getChildren().add(informesCreateInput);
        
        Message informesCreateInputMessage = (Message) application.createComponent(Message.COMPONENT_TYPE);
        informesCreateInputMessage.setId("informesCreateInputMessage");
        informesCreateInputMessage.setFor("informesCreateInput");
        informesCreateInputMessage.setDisplay("icon");
        htmlPanelGrid.getChildren().add(informesCreateInputMessage);
        
        HtmlOutputText intUbigeoSucesoIdCreateOutput = (HtmlOutputText) application.createComponent(HtmlOutputText.COMPONENT_TYPE);
        intUbigeoSucesoIdCreateOutput.setId("intUbigeoSucesoIdCreateOutput");
        intUbigeoSucesoIdCreateOutput.setValue("Int Ubigeo Suceso Id:   ");
        htmlPanelGrid.getChildren().add(intUbigeoSucesoIdCreateOutput);
        
        AutoComplete intUbigeoSucesoIdCreateInput = (AutoComplete) application.createComponent(AutoComplete.COMPONENT_TYPE);
        intUbigeoSucesoIdCreateInput.setId("intUbigeoSucesoIdCreateInput");
        intUbigeoSucesoIdCreateInput.setValueExpression("value", expressionFactory.createValueExpression(elContext, "#{expedienteBean.expediente.intUbigeoSucesoId}", TablaMaestra.class));
        intUbigeoSucesoIdCreateInput.setCompleteMethod(expressionFactory.createMethodExpression(elContext, "#{expedienteBean.completeIntUbigeoSucesoId}", List.class, new Class[] { String.class }));
        intUbigeoSucesoIdCreateInput.setDropdown(true);
        intUbigeoSucesoIdCreateInput.setValueExpression("var", expressionFactory.createValueExpression(elContext, "intUbigeoSucesoId", String.class));
        intUbigeoSucesoIdCreateInput.setValueExpression("itemLabel", expressionFactory.createValueExpression(elContext, "#{intUbigeoSucesoId.strDescripcion} #{intUbigeoSucesoId.chrEstado} #{intUbigeoSucesoId.intTablaId}", String.class));
        intUbigeoSucesoIdCreateInput.setValueExpression("itemValue", expressionFactory.createValueExpression(elContext, "#{intUbigeoSucesoId}", TablaMaestra.class));
        intUbigeoSucesoIdCreateInput.setConverter(new TablaMaestraConverter());
        intUbigeoSucesoIdCreateInput.setRequired(false);
        htmlPanelGrid.getChildren().add(intUbigeoSucesoIdCreateInput);
        
        Message intUbigeoSucesoIdCreateInputMessage = (Message) application.createComponent(Message.COMPONENT_TYPE);
        intUbigeoSucesoIdCreateInputMessage.setId("intUbigeoSucesoIdCreateInputMessage");
        intUbigeoSucesoIdCreateInputMessage.setFor("intUbigeoSucesoIdCreateInput");
        intUbigeoSucesoIdCreateInputMessage.setDisplay("icon");
        htmlPanelGrid.getChildren().add(intUbigeoSucesoIdCreateInputMessage);
        
        HtmlOutputText intDependenciaIdCreateOutput = (HtmlOutputText) application.createComponent(HtmlOutputText.COMPONENT_TYPE);
        intDependenciaIdCreateOutput.setId("intDependenciaIdCreateOutput");
        intDependenciaIdCreateOutput.setValue("Int Dependencia Id:   ");
        htmlPanelGrid.getChildren().add(intDependenciaIdCreateOutput);
        
        AutoComplete intDependenciaIdCreateInput = (AutoComplete) application.createComponent(AutoComplete.COMPONENT_TYPE);
        intDependenciaIdCreateInput.setId("intDependenciaIdCreateInput");
        intDependenciaIdCreateInput.setValueExpression("value", expressionFactory.createValueExpression(elContext, "#{expedienteBean.expediente.intDependenciaId}", TablaMaestra.class));
        intDependenciaIdCreateInput.setCompleteMethod(expressionFactory.createMethodExpression(elContext, "#{expedienteBean.completeIntDependenciaId}", List.class, new Class[] { String.class }));
        intDependenciaIdCreateInput.setDropdown(true);
        intDependenciaIdCreateInput.setValueExpression("var", expressionFactory.createValueExpression(elContext, "intDependenciaId", String.class));
        intDependenciaIdCreateInput.setValueExpression("itemLabel", expressionFactory.createValueExpression(elContext, "#{intDependenciaId.strDescripcion} #{intDependenciaId.chrEstado} #{intDependenciaId.intTablaId}", String.class));
        intDependenciaIdCreateInput.setValueExpression("itemValue", expressionFactory.createValueExpression(elContext, "#{intDependenciaId}", TablaMaestra.class));
        intDependenciaIdCreateInput.setConverter(new TablaMaestraConverter());
        intDependenciaIdCreateInput.setRequired(false);
        htmlPanelGrid.getChildren().add(intDependenciaIdCreateInput);
        
        Message intDependenciaIdCreateInputMessage = (Message) application.createComponent(Message.COMPONENT_TYPE);
        intDependenciaIdCreateInputMessage.setId("intDependenciaIdCreateInputMessage");
        intDependenciaIdCreateInputMessage.setFor("intDependenciaIdCreateInput");
        intDependenciaIdCreateInputMessage.setDisplay("icon");
        htmlPanelGrid.getChildren().add(intDependenciaIdCreateInputMessage);
        
        HtmlOutputText intTipoExpedienteIdCreateOutput = (HtmlOutputText) application.createComponent(HtmlOutputText.COMPONENT_TYPE);
        intTipoExpedienteIdCreateOutput.setId("intTipoExpedienteIdCreateOutput");
        intTipoExpedienteIdCreateOutput.setValue("Int Tipo Expediente Id:   ");
        htmlPanelGrid.getChildren().add(intTipoExpedienteIdCreateOutput);
        
        AutoComplete intTipoExpedienteIdCreateInput = (AutoComplete) application.createComponent(AutoComplete.COMPONENT_TYPE);
        intTipoExpedienteIdCreateInput.setId("intTipoExpedienteIdCreateInput");
        intTipoExpedienteIdCreateInput.setValueExpression("value", expressionFactory.createValueExpression(elContext, "#{expedienteBean.expediente.intTipoExpedienteId}", TablaMaestra.class));
        intTipoExpedienteIdCreateInput.setCompleteMethod(expressionFactory.createMethodExpression(elContext, "#{expedienteBean.completeIntTipoExpedienteId}", List.class, new Class[] { String.class }));
        intTipoExpedienteIdCreateInput.setDropdown(true);
        intTipoExpedienteIdCreateInput.setValueExpression("var", expressionFactory.createValueExpression(elContext, "intTipoExpedienteId", String.class));
        intTipoExpedienteIdCreateInput.setValueExpression("itemLabel", expressionFactory.createValueExpression(elContext, "#{intTipoExpedienteId.strDescripcion} #{intTipoExpedienteId.chrEstado} #{intTipoExpedienteId.intTablaId}", String.class));
        intTipoExpedienteIdCreateInput.setValueExpression("itemValue", expressionFactory.createValueExpression(elContext, "#{intTipoExpedienteId}", TablaMaestra.class));
        intTipoExpedienteIdCreateInput.setConverter(new TablaMaestraConverter());
        intTipoExpedienteIdCreateInput.setRequired(false);
        htmlPanelGrid.getChildren().add(intTipoExpedienteIdCreateInput);
        
        Message intTipoExpedienteIdCreateInputMessage = (Message) application.createComponent(Message.COMPONENT_TYPE);
        intTipoExpedienteIdCreateInputMessage.setId("intTipoExpedienteIdCreateInputMessage");
        intTipoExpedienteIdCreateInputMessage.setFor("intTipoExpedienteIdCreateInput");
        intTipoExpedienteIdCreateInputMessage.setDisplay("icon");
        htmlPanelGrid.getChildren().add(intTipoExpedienteIdCreateInputMessage);
        
        HtmlOutputText strLugarSucesoCreateOutput = (HtmlOutputText) application.createComponent(HtmlOutputText.COMPONENT_TYPE);
        strLugarSucesoCreateOutput.setId("strLugarSucesoCreateOutput");
        strLugarSucesoCreateOutput.setValue("Str Lugar Suceso: * ");
        htmlPanelGrid.getChildren().add(strLugarSucesoCreateOutput);
        
        InputTextarea strLugarSucesoCreateInput = (InputTextarea) application.createComponent(InputTextarea.COMPONENT_TYPE);
        strLugarSucesoCreateInput.setId("strLugarSucesoCreateInput");
        strLugarSucesoCreateInput.setValueExpression("value", expressionFactory.createValueExpression(elContext, "#{expedienteBean.expediente.strLugarSuceso}", String.class));
        LengthValidator strLugarSucesoCreateInputValidator = new LengthValidator();
        strLugarSucesoCreateInputValidator.setMaximum(100);
        strLugarSucesoCreateInput.addValidator(strLugarSucesoCreateInputValidator);
        strLugarSucesoCreateInput.setRequired(true);
        htmlPanelGrid.getChildren().add(strLugarSucesoCreateInput);
        
        Message strLugarSucesoCreateInputMessage = (Message) application.createComponent(Message.COMPONENT_TYPE);
        strLugarSucesoCreateInputMessage.setId("strLugarSucesoCreateInputMessage");
        strLugarSucesoCreateInputMessage.setFor("strLugarSucesoCreateInput");
        strLugarSucesoCreateInputMessage.setDisplay("icon");
        htmlPanelGrid.getChildren().add(strLugarSucesoCreateInputMessage);
        
        HtmlOutputText datFechaRegistroCreateOutput = (HtmlOutputText) application.createComponent(HtmlOutputText.COMPONENT_TYPE);
        datFechaRegistroCreateOutput.setId("datFechaRegistroCreateOutput");
        datFechaRegistroCreateOutput.setValue("Dat Fecha Registro: * ");
        htmlPanelGrid.getChildren().add(datFechaRegistroCreateOutput);
        
        Calendar datFechaRegistroCreateInput = (Calendar) application.createComponent(Calendar.COMPONENT_TYPE);
        datFechaRegistroCreateInput.setId("datFechaRegistroCreateInput");
        datFechaRegistroCreateInput.setValueExpression("value", expressionFactory.createValueExpression(elContext, "#{expedienteBean.expediente.datFechaRegistro}", Date.class));
        datFechaRegistroCreateInput.setNavigator(true);
        datFechaRegistroCreateInput.setEffect("slideDown");
        datFechaRegistroCreateInput.setPattern("dd/MM/yyyy");
        datFechaRegistroCreateInput.setRequired(true);
        htmlPanelGrid.getChildren().add(datFechaRegistroCreateInput);
        
        Message datFechaRegistroCreateInputMessage = (Message) application.createComponent(Message.COMPONENT_TYPE);
        datFechaRegistroCreateInputMessage.setId("datFechaRegistroCreateInputMessage");
        datFechaRegistroCreateInputMessage.setFor("datFechaRegistroCreateInput");
        datFechaRegistroCreateInputMessage.setDisplay("icon");
        htmlPanelGrid.getChildren().add(datFechaRegistroCreateInputMessage);
        
        HtmlOutputText datFechaSucesoCreateOutput = (HtmlOutputText) application.createComponent(HtmlOutputText.COMPONENT_TYPE);
        datFechaSucesoCreateOutput.setId("datFechaSucesoCreateOutput");
        datFechaSucesoCreateOutput.setValue("Dat Fecha Suceso: * ");
        htmlPanelGrid.getChildren().add(datFechaSucesoCreateOutput);
        
        Calendar datFechaSucesoCreateInput = (Calendar) application.createComponent(Calendar.COMPONENT_TYPE);
        datFechaSucesoCreateInput.setId("datFechaSucesoCreateInput");
        datFechaSucesoCreateInput.setValueExpression("value", expressionFactory.createValueExpression(elContext, "#{expedienteBean.expediente.datFechaSuceso}", Date.class));
        datFechaSucesoCreateInput.setNavigator(true);
        datFechaSucesoCreateInput.setEffect("slideDown");
        datFechaSucesoCreateInput.setPattern("dd/MM/yyyy");
        datFechaSucesoCreateInput.setRequired(true);
        htmlPanelGrid.getChildren().add(datFechaSucesoCreateInput);
        
        Message datFechaSucesoCreateInputMessage = (Message) application.createComponent(Message.COMPONENT_TYPE);
        datFechaSucesoCreateInputMessage.setId("datFechaSucesoCreateInputMessage");
        datFechaSucesoCreateInputMessage.setFor("datFechaSucesoCreateInput");
        datFechaSucesoCreateInputMessage.setDisplay("icon");
        htmlPanelGrid.getChildren().add(datFechaSucesoCreateInputMessage);
        
        return htmlPanelGrid;
    }

	public HtmlPanelGrid populateEditPanel() {
        FacesContext facesContext = FacesContext.getCurrentInstance();
        Application application = facesContext.getApplication();
        ExpressionFactory expressionFactory = application.getExpressionFactory();
        ELContext elContext = facesContext.getELContext();
        
        HtmlPanelGrid htmlPanelGrid = (HtmlPanelGrid) application.createComponent(HtmlPanelGrid.COMPONENT_TYPE);
        
        HtmlOutputText diligenciasEditOutput = (HtmlOutputText) application.createComponent(HtmlOutputText.COMPONENT_TYPE);
        diligenciasEditOutput.setId("diligenciasEditOutput");
        diligenciasEditOutput.setValue("Diligencias:   ");
        htmlPanelGrid.getChildren().add(diligenciasEditOutput);
        
        HtmlOutputText diligenciasEditInput = (HtmlOutputText) application.createComponent(HtmlOutputText.COMPONENT_TYPE);
        diligenciasEditInput.setId("diligenciasEditInput");
        diligenciasEditInput.setValue("This relationship is managed from the Diligencia side");
        htmlPanelGrid.getChildren().add(diligenciasEditInput);
        
        Message diligenciasEditInputMessage = (Message) application.createComponent(Message.COMPONENT_TYPE);
        diligenciasEditInputMessage.setId("diligenciasEditInputMessage");
        diligenciasEditInputMessage.setFor("diligenciasEditInput");
        diligenciasEditInputMessage.setDisplay("icon");
        htmlPanelGrid.getChildren().add(diligenciasEditInputMessage);
        
        HtmlOutputText expedientePartesEditOutput = (HtmlOutputText) application.createComponent(HtmlOutputText.COMPONENT_TYPE);
        expedientePartesEditOutput.setId("expedientePartesEditOutput");
        expedientePartesEditOutput.setValue("Expediente Partes:   ");
        htmlPanelGrid.getChildren().add(expedientePartesEditOutput);
        
        HtmlOutputText expedientePartesEditInput = (HtmlOutputText) application.createComponent(HtmlOutputText.COMPONENT_TYPE);
        expedientePartesEditInput.setId("expedientePartesEditInput");
        expedientePartesEditInput.setValue("This relationship is managed from the ExpedienteParte side");
        htmlPanelGrid.getChildren().add(expedientePartesEditInput);
        
        Message expedientePartesEditInputMessage = (Message) application.createComponent(Message.COMPONENT_TYPE);
        expedientePartesEditInputMessage.setId("expedientePartesEditInputMessage");
        expedientePartesEditInputMessage.setFor("expedientePartesEditInput");
        expedientePartesEditInputMessage.setDisplay("icon");
        htmlPanelGrid.getChildren().add(expedientePartesEditInputMessage);
        
        HtmlOutputText informesEditOutput = (HtmlOutputText) application.createComponent(HtmlOutputText.COMPONENT_TYPE);
        informesEditOutput.setId("informesEditOutput");
        informesEditOutput.setValue("Informes:   ");
        htmlPanelGrid.getChildren().add(informesEditOutput);
        
        HtmlOutputText informesEditInput = (HtmlOutputText) application.createComponent(HtmlOutputText.COMPONENT_TYPE);
        informesEditInput.setId("informesEditInput");
        informesEditInput.setValue("This relationship is managed from the Informe side");
        htmlPanelGrid.getChildren().add(informesEditInput);
        
        Message informesEditInputMessage = (Message) application.createComponent(Message.COMPONENT_TYPE);
        informesEditInputMessage.setId("informesEditInputMessage");
        informesEditInputMessage.setFor("informesEditInput");
        informesEditInputMessage.setDisplay("icon");
        htmlPanelGrid.getChildren().add(informesEditInputMessage);
        
        HtmlOutputText intUbigeoSucesoIdEditOutput = (HtmlOutputText) application.createComponent(HtmlOutputText.COMPONENT_TYPE);
        intUbigeoSucesoIdEditOutput.setId("intUbigeoSucesoIdEditOutput");
        intUbigeoSucesoIdEditOutput.setValue("Int Ubigeo Suceso Id:   ");
        htmlPanelGrid.getChildren().add(intUbigeoSucesoIdEditOutput);
        
        AutoComplete intUbigeoSucesoIdEditInput = (AutoComplete) application.createComponent(AutoComplete.COMPONENT_TYPE);
        intUbigeoSucesoIdEditInput.setId("intUbigeoSucesoIdEditInput");
        intUbigeoSucesoIdEditInput.setValueExpression("value", expressionFactory.createValueExpression(elContext, "#{expedienteBean.expediente.intUbigeoSucesoId}", TablaMaestra.class));
        intUbigeoSucesoIdEditInput.setCompleteMethod(expressionFactory.createMethodExpression(elContext, "#{expedienteBean.completeIntUbigeoSucesoId}", List.class, new Class[] { String.class }));
        intUbigeoSucesoIdEditInput.setDropdown(true);
        intUbigeoSucesoIdEditInput.setValueExpression("var", expressionFactory.createValueExpression(elContext, "intUbigeoSucesoId", String.class));
        intUbigeoSucesoIdEditInput.setValueExpression("itemLabel", expressionFactory.createValueExpression(elContext, "#{intUbigeoSucesoId.strDescripcion} #{intUbigeoSucesoId.chrEstado} #{intUbigeoSucesoId.intTablaId}", String.class));
        intUbigeoSucesoIdEditInput.setValueExpression("itemValue", expressionFactory.createValueExpression(elContext, "#{intUbigeoSucesoId}", TablaMaestra.class));
        intUbigeoSucesoIdEditInput.setConverter(new TablaMaestraConverter());
        intUbigeoSucesoIdEditInput.setRequired(false);
        htmlPanelGrid.getChildren().add(intUbigeoSucesoIdEditInput);
        
        Message intUbigeoSucesoIdEditInputMessage = (Message) application.createComponent(Message.COMPONENT_TYPE);
        intUbigeoSucesoIdEditInputMessage.setId("intUbigeoSucesoIdEditInputMessage");
        intUbigeoSucesoIdEditInputMessage.setFor("intUbigeoSucesoIdEditInput");
        intUbigeoSucesoIdEditInputMessage.setDisplay("icon");
        htmlPanelGrid.getChildren().add(intUbigeoSucesoIdEditInputMessage);
        
        HtmlOutputText intDependenciaIdEditOutput = (HtmlOutputText) application.createComponent(HtmlOutputText.COMPONENT_TYPE);
        intDependenciaIdEditOutput.setId("intDependenciaIdEditOutput");
        intDependenciaIdEditOutput.setValue("Int Dependencia Id:   ");
        htmlPanelGrid.getChildren().add(intDependenciaIdEditOutput);
        
        AutoComplete intDependenciaIdEditInput = (AutoComplete) application.createComponent(AutoComplete.COMPONENT_TYPE);
        intDependenciaIdEditInput.setId("intDependenciaIdEditInput");
        intDependenciaIdEditInput.setValueExpression("value", expressionFactory.createValueExpression(elContext, "#{expedienteBean.expediente.intDependenciaId}", TablaMaestra.class));
        intDependenciaIdEditInput.setCompleteMethod(expressionFactory.createMethodExpression(elContext, "#{expedienteBean.completeIntDependenciaId}", List.class, new Class[] { String.class }));
        intDependenciaIdEditInput.setDropdown(true);
        intDependenciaIdEditInput.setValueExpression("var", expressionFactory.createValueExpression(elContext, "intDependenciaId", String.class));
        intDependenciaIdEditInput.setValueExpression("itemLabel", expressionFactory.createValueExpression(elContext, "#{intDependenciaId.strDescripcion} #{intDependenciaId.chrEstado} #{intDependenciaId.intTablaId}", String.class));
        intDependenciaIdEditInput.setValueExpression("itemValue", expressionFactory.createValueExpression(elContext, "#{intDependenciaId}", TablaMaestra.class));
        intDependenciaIdEditInput.setConverter(new TablaMaestraConverter());
        intDependenciaIdEditInput.setRequired(false);
        htmlPanelGrid.getChildren().add(intDependenciaIdEditInput);
        
        Message intDependenciaIdEditInputMessage = (Message) application.createComponent(Message.COMPONENT_TYPE);
        intDependenciaIdEditInputMessage.setId("intDependenciaIdEditInputMessage");
        intDependenciaIdEditInputMessage.setFor("intDependenciaIdEditInput");
        intDependenciaIdEditInputMessage.setDisplay("icon");
        htmlPanelGrid.getChildren().add(intDependenciaIdEditInputMessage);
        
        HtmlOutputText intTipoExpedienteIdEditOutput = (HtmlOutputText) application.createComponent(HtmlOutputText.COMPONENT_TYPE);
        intTipoExpedienteIdEditOutput.setId("intTipoExpedienteIdEditOutput");
        intTipoExpedienteIdEditOutput.setValue("Int Tipo Expediente Id:   ");
        htmlPanelGrid.getChildren().add(intTipoExpedienteIdEditOutput);
        
        AutoComplete intTipoExpedienteIdEditInput = (AutoComplete) application.createComponent(AutoComplete.COMPONENT_TYPE);
        intTipoExpedienteIdEditInput.setId("intTipoExpedienteIdEditInput");
        intTipoExpedienteIdEditInput.setValueExpression("value", expressionFactory.createValueExpression(elContext, "#{expedienteBean.expediente.intTipoExpedienteId}", TablaMaestra.class));
        intTipoExpedienteIdEditInput.setCompleteMethod(expressionFactory.createMethodExpression(elContext, "#{expedienteBean.completeIntTipoExpedienteId}", List.class, new Class[] { String.class }));
        intTipoExpedienteIdEditInput.setDropdown(true);
        intTipoExpedienteIdEditInput.setValueExpression("var", expressionFactory.createValueExpression(elContext, "intTipoExpedienteId", String.class));
        intTipoExpedienteIdEditInput.setValueExpression("itemLabel", expressionFactory.createValueExpression(elContext, "#{intTipoExpedienteId.strDescripcion} #{intTipoExpedienteId.chrEstado} #{intTipoExpedienteId.intTablaId}", String.class));
        intTipoExpedienteIdEditInput.setValueExpression("itemValue", expressionFactory.createValueExpression(elContext, "#{intTipoExpedienteId}", TablaMaestra.class));
        intTipoExpedienteIdEditInput.setConverter(new TablaMaestraConverter());
        intTipoExpedienteIdEditInput.setRequired(false);
        htmlPanelGrid.getChildren().add(intTipoExpedienteIdEditInput);
        
        Message intTipoExpedienteIdEditInputMessage = (Message) application.createComponent(Message.COMPONENT_TYPE);
        intTipoExpedienteIdEditInputMessage.setId("intTipoExpedienteIdEditInputMessage");
        intTipoExpedienteIdEditInputMessage.setFor("intTipoExpedienteIdEditInput");
        intTipoExpedienteIdEditInputMessage.setDisplay("icon");
        htmlPanelGrid.getChildren().add(intTipoExpedienteIdEditInputMessage);
        
        HtmlOutputText strLugarSucesoEditOutput = (HtmlOutputText) application.createComponent(HtmlOutputText.COMPONENT_TYPE);
        strLugarSucesoEditOutput.setId("strLugarSucesoEditOutput");
        strLugarSucesoEditOutput.setValue("Str Lugar Suceso: * ");
        htmlPanelGrid.getChildren().add(strLugarSucesoEditOutput);
        
        InputTextarea strLugarSucesoEditInput = (InputTextarea) application.createComponent(InputTextarea.COMPONENT_TYPE);
        strLugarSucesoEditInput.setId("strLugarSucesoEditInput");
        strLugarSucesoEditInput.setValueExpression("value", expressionFactory.createValueExpression(elContext, "#{expedienteBean.expediente.strLugarSuceso}", String.class));
        LengthValidator strLugarSucesoEditInputValidator = new LengthValidator();
        strLugarSucesoEditInputValidator.setMaximum(100);
        strLugarSucesoEditInput.addValidator(strLugarSucesoEditInputValidator);
        strLugarSucesoEditInput.setRequired(true);
        htmlPanelGrid.getChildren().add(strLugarSucesoEditInput);
        
        Message strLugarSucesoEditInputMessage = (Message) application.createComponent(Message.COMPONENT_TYPE);
        strLugarSucesoEditInputMessage.setId("strLugarSucesoEditInputMessage");
        strLugarSucesoEditInputMessage.setFor("strLugarSucesoEditInput");
        strLugarSucesoEditInputMessage.setDisplay("icon");
        htmlPanelGrid.getChildren().add(strLugarSucesoEditInputMessage);
        
        HtmlOutputText datFechaRegistroEditOutput = (HtmlOutputText) application.createComponent(HtmlOutputText.COMPONENT_TYPE);
        datFechaRegistroEditOutput.setId("datFechaRegistroEditOutput");
        datFechaRegistroEditOutput.setValue("Dat Fecha Registro: * ");
        htmlPanelGrid.getChildren().add(datFechaRegistroEditOutput);
        
        Calendar datFechaRegistroEditInput = (Calendar) application.createComponent(Calendar.COMPONENT_TYPE);
        datFechaRegistroEditInput.setId("datFechaRegistroEditInput");
        datFechaRegistroEditInput.setValueExpression("value", expressionFactory.createValueExpression(elContext, "#{expedienteBean.expediente.datFechaRegistro}", Date.class));
        datFechaRegistroEditInput.setNavigator(true);
        datFechaRegistroEditInput.setEffect("slideDown");
        datFechaRegistroEditInput.setPattern("dd/MM/yyyy");
        datFechaRegistroEditInput.setRequired(true);
        htmlPanelGrid.getChildren().add(datFechaRegistroEditInput);
        
        Message datFechaRegistroEditInputMessage = (Message) application.createComponent(Message.COMPONENT_TYPE);
        datFechaRegistroEditInputMessage.setId("datFechaRegistroEditInputMessage");
        datFechaRegistroEditInputMessage.setFor("datFechaRegistroEditInput");
        datFechaRegistroEditInputMessage.setDisplay("icon");
        htmlPanelGrid.getChildren().add(datFechaRegistroEditInputMessage);
        
        HtmlOutputText datFechaSucesoEditOutput = (HtmlOutputText) application.createComponent(HtmlOutputText.COMPONENT_TYPE);
        datFechaSucesoEditOutput.setId("datFechaSucesoEditOutput");
        datFechaSucesoEditOutput.setValue("Dat Fecha Suceso: * ");
        htmlPanelGrid.getChildren().add(datFechaSucesoEditOutput);
        
        Calendar datFechaSucesoEditInput = (Calendar) application.createComponent(Calendar.COMPONENT_TYPE);
        datFechaSucesoEditInput.setId("datFechaSucesoEditInput");
        datFechaSucesoEditInput.setValueExpression("value", expressionFactory.createValueExpression(elContext, "#{expedienteBean.expediente.datFechaSuceso}", Date.class));
        datFechaSucesoEditInput.setNavigator(true);
        datFechaSucesoEditInput.setEffect("slideDown");
        datFechaSucesoEditInput.setPattern("dd/MM/yyyy");
        datFechaSucesoEditInput.setRequired(true);
        htmlPanelGrid.getChildren().add(datFechaSucesoEditInput);
        
        Message datFechaSucesoEditInputMessage = (Message) application.createComponent(Message.COMPONENT_TYPE);
        datFechaSucesoEditInputMessage.setId("datFechaSucesoEditInputMessage");
        datFechaSucesoEditInputMessage.setFor("datFechaSucesoEditInput");
        datFechaSucesoEditInputMessage.setDisplay("icon");
        htmlPanelGrid.getChildren().add(datFechaSucesoEditInputMessage);
        
        return htmlPanelGrid;
    }

	public HtmlPanelGrid populateViewPanel() {
        FacesContext facesContext = FacesContext.getCurrentInstance();
        Application application = facesContext.getApplication();
        ExpressionFactory expressionFactory = application.getExpressionFactory();
        ELContext elContext = facesContext.getELContext();
        
        HtmlPanelGrid htmlPanelGrid = (HtmlPanelGrid) application.createComponent(HtmlPanelGrid.COMPONENT_TYPE);
        
        HtmlOutputText diligenciasLabel = (HtmlOutputText) application.createComponent(HtmlOutputText.COMPONENT_TYPE);
        diligenciasLabel.setId("diligenciasLabel");
        diligenciasLabel.setValue("Diligencias:   ");
        htmlPanelGrid.getChildren().add(diligenciasLabel);
        
        HtmlOutputText diligenciasValue = (HtmlOutputText) application.createComponent(HtmlOutputText.COMPONENT_TYPE);
        diligenciasValue.setId("diligenciasValue");
        diligenciasValue.setValue("This relationship is managed from the Diligencia side");
        htmlPanelGrid.getChildren().add(diligenciasValue);
        
        HtmlOutputText expedientePartesLabel = (HtmlOutputText) application.createComponent(HtmlOutputText.COMPONENT_TYPE);
        expedientePartesLabel.setId("expedientePartesLabel");
        expedientePartesLabel.setValue("Expediente Partes:   ");
        htmlPanelGrid.getChildren().add(expedientePartesLabel);
        
        HtmlOutputText expedientePartesValue = (HtmlOutputText) application.createComponent(HtmlOutputText.COMPONENT_TYPE);
        expedientePartesValue.setId("expedientePartesValue");
        expedientePartesValue.setValue("This relationship is managed from the ExpedienteParte side");
        htmlPanelGrid.getChildren().add(expedientePartesValue);
        
        HtmlOutputText informesLabel = (HtmlOutputText) application.createComponent(HtmlOutputText.COMPONENT_TYPE);
        informesLabel.setId("informesLabel");
        informesLabel.setValue("Informes:   ");
        htmlPanelGrid.getChildren().add(informesLabel);
        
        HtmlOutputText informesValue = (HtmlOutputText) application.createComponent(HtmlOutputText.COMPONENT_TYPE);
        informesValue.setId("informesValue");
        informesValue.setValue("This relationship is managed from the Informe side");
        htmlPanelGrid.getChildren().add(informesValue);
        
        HtmlOutputText intUbigeoSucesoIdLabel = (HtmlOutputText) application.createComponent(HtmlOutputText.COMPONENT_TYPE);
        intUbigeoSucesoIdLabel.setId("intUbigeoSucesoIdLabel");
        intUbigeoSucesoIdLabel.setValue("Int Ubigeo Suceso Id:   ");
        htmlPanelGrid.getChildren().add(intUbigeoSucesoIdLabel);
        
        HtmlOutputText intUbigeoSucesoIdValue = (HtmlOutputText) application.createComponent(HtmlOutputText.COMPONENT_TYPE);
        intUbigeoSucesoIdValue.setValueExpression("value", expressionFactory.createValueExpression(elContext, "#{expedienteBean.expediente.intUbigeoSucesoId}", TablaMaestra.class));
        intUbigeoSucesoIdValue.setConverter(new TablaMaestraConverter());
        htmlPanelGrid.getChildren().add(intUbigeoSucesoIdValue);
        
        HtmlOutputText intDependenciaIdLabel = (HtmlOutputText) application.createComponent(HtmlOutputText.COMPONENT_TYPE);
        intDependenciaIdLabel.setId("intDependenciaIdLabel");
        intDependenciaIdLabel.setValue("Int Dependencia Id:   ");
        htmlPanelGrid.getChildren().add(intDependenciaIdLabel);
        
        HtmlOutputText intDependenciaIdValue = (HtmlOutputText) application.createComponent(HtmlOutputText.COMPONENT_TYPE);
        intDependenciaIdValue.setValueExpression("value", expressionFactory.createValueExpression(elContext, "#{expedienteBean.expediente.intDependenciaId}", TablaMaestra.class));
        intDependenciaIdValue.setConverter(new TablaMaestraConverter());
        htmlPanelGrid.getChildren().add(intDependenciaIdValue);
        
        HtmlOutputText intTipoExpedienteIdLabel = (HtmlOutputText) application.createComponent(HtmlOutputText.COMPONENT_TYPE);
        intTipoExpedienteIdLabel.setId("intTipoExpedienteIdLabel");
        intTipoExpedienteIdLabel.setValue("Int Tipo Expediente Id:   ");
        htmlPanelGrid.getChildren().add(intTipoExpedienteIdLabel);
        
        HtmlOutputText intTipoExpedienteIdValue = (HtmlOutputText) application.createComponent(HtmlOutputText.COMPONENT_TYPE);
        intTipoExpedienteIdValue.setValueExpression("value", expressionFactory.createValueExpression(elContext, "#{expedienteBean.expediente.intTipoExpedienteId}", TablaMaestra.class));
        intTipoExpedienteIdValue.setConverter(new TablaMaestraConverter());
        htmlPanelGrid.getChildren().add(intTipoExpedienteIdValue);
        
        HtmlOutputText strLugarSucesoLabel = (HtmlOutputText) application.createComponent(HtmlOutputText.COMPONENT_TYPE);
        strLugarSucesoLabel.setId("strLugarSucesoLabel");
        strLugarSucesoLabel.setValue("Str Lugar Suceso:   ");
        htmlPanelGrid.getChildren().add(strLugarSucesoLabel);
        
        InputTextarea strLugarSucesoValue = (InputTextarea) application.createComponent(InputTextarea.COMPONENT_TYPE);
        strLugarSucesoValue.setId("strLugarSucesoValue");
        strLugarSucesoValue.setValueExpression("value", expressionFactory.createValueExpression(elContext, "#{expedienteBean.expediente.strLugarSuceso}", String.class));
        strLugarSucesoValue.setReadonly(true);
        strLugarSucesoValue.setDisabled(true);
        htmlPanelGrid.getChildren().add(strLugarSucesoValue);
        
        HtmlOutputText datFechaRegistroLabel = (HtmlOutputText) application.createComponent(HtmlOutputText.COMPONENT_TYPE);
        datFechaRegistroLabel.setId("datFechaRegistroLabel");
        datFechaRegistroLabel.setValue("Dat Fecha Registro:   ");
        htmlPanelGrid.getChildren().add(datFechaRegistroLabel);
        
        HtmlOutputText datFechaRegistroValue = (HtmlOutputText) application.createComponent(HtmlOutputText.COMPONENT_TYPE);
        datFechaRegistroValue.setValueExpression("value", expressionFactory.createValueExpression(elContext, "#{expedienteBean.expediente.datFechaRegistro}", Date.class));
        DateTimeConverter datFechaRegistroValueConverter = (DateTimeConverter) application.createConverter(DateTimeConverter.CONVERTER_ID);
        datFechaRegistroValueConverter.setPattern("dd/MM/yyyy");
        datFechaRegistroValue.setConverter(datFechaRegistroValueConverter);
        htmlPanelGrid.getChildren().add(datFechaRegistroValue);
        
        HtmlOutputText datFechaSucesoLabel = (HtmlOutputText) application.createComponent(HtmlOutputText.COMPONENT_TYPE);
        datFechaSucesoLabel.setId("datFechaSucesoLabel");
        datFechaSucesoLabel.setValue("Dat Fecha Suceso:   ");
        htmlPanelGrid.getChildren().add(datFechaSucesoLabel);
        
        HtmlOutputText datFechaSucesoValue = (HtmlOutputText) application.createComponent(HtmlOutputText.COMPONENT_TYPE);
        datFechaSucesoValue.setValueExpression("value", expressionFactory.createValueExpression(elContext, "#{expedienteBean.expediente.datFechaSuceso}", Date.class));
        DateTimeConverter datFechaSucesoValueConverter = (DateTimeConverter) application.createConverter(DateTimeConverter.CONVERTER_ID);
        datFechaSucesoValueConverter.setPattern("dd/MM/yyyy");
        datFechaSucesoValue.setConverter(datFechaSucesoValueConverter);
        htmlPanelGrid.getChildren().add(datFechaSucesoValue);
        
        return htmlPanelGrid;
    }

	public Expediente getExpediente() {
        if (expediente == null) {
            expediente = new Expediente();
        }
        return expediente;
    }

	public void setExpediente(Expediente expediente) {
        this.expediente = expediente;
    }

	public List<Diligencia> getSelectedDiligencias() {
        return selectedDiligencias;
    }

	public void setSelectedDiligencias(List<Diligencia> selectedDiligencias) {
        if (selectedDiligencias != null) {
            expediente.setDiligencias(new HashSet<Diligencia>(selectedDiligencias));
        }
        this.selectedDiligencias = selectedDiligencias;
    }

	public List<ExpedienteParte> getSelectedExpedientePartes() {
        return selectedExpedientePartes;
    }

	public void setSelectedExpedientePartes(List<ExpedienteParte> selectedExpedientePartes) {
        if (selectedExpedientePartes != null) {
            expediente.setExpedientePartes(new HashSet<ExpedienteParte>(selectedExpedientePartes));
        }
        this.selectedExpedientePartes = selectedExpedientePartes;
    }

	public List<Informe> getSelectedInformes() {
        return selectedInformes;
    }

	public void setSelectedInformes(List<Informe> selectedInformes) {
        if (selectedInformes != null) {
            expediente.setInformes(new HashSet<Informe>(selectedInformes));
        }
        this.selectedInformes = selectedInformes;
    }

	public List<TablaMaestra> completeIntUbigeoSucesoId(String query) {
        List<TablaMaestra> suggestions = new ArrayList<TablaMaestra>();
        for (TablaMaestra tablaMaestra : tablaMaestraService.findAllTablaMaestras()) {
            String tablaMaestraStr = String.valueOf(tablaMaestra.getStrDescripcion() +  " "  + tablaMaestra.getChrEstado() +  " "  + tablaMaestra.getIntTablaId());
            if (tablaMaestraStr.toLowerCase().startsWith(query.toLowerCase())) {
                suggestions.add(tablaMaestra);
            }
        }
        return suggestions;
    }

	public List<TablaMaestra> completeIntDependenciaId(String query) {
        List<TablaMaestra> suggestions = new ArrayList<TablaMaestra>();
        for (TablaMaestra tablaMaestra : tablaMaestraService.findAllTablaMaestras()) {
            String tablaMaestraStr = String.valueOf(tablaMaestra.getStrDescripcion() +  " "  + tablaMaestra.getChrEstado() +  " "  + tablaMaestra.getIntTablaId());
            if (tablaMaestraStr.toLowerCase().startsWith(query.toLowerCase())) {
                suggestions.add(tablaMaestra);
            }
        }
        return suggestions;
    }

	public List<TablaMaestra> completeIntTipoExpedienteId(String query) {
        List<TablaMaestra> suggestions = new ArrayList<TablaMaestra>();
        for (TablaMaestra tablaMaestra : tablaMaestraService.findAllTablaMaestras()) {
            String tablaMaestraStr = String.valueOf(tablaMaestra.getStrDescripcion() +  " "  + tablaMaestra.getChrEstado() +  " "  + tablaMaestra.getIntTablaId());
            if (tablaMaestraStr.toLowerCase().startsWith(query.toLowerCase())) {
                suggestions.add(tablaMaestra);
            }
        }
        return suggestions;
    }

	public String onEdit() {
        if (expediente != null && expediente.getDiligencias() != null) {
            selectedDiligencias = new ArrayList<Diligencia>(expediente.getDiligencias());
        }
        if (expediente != null && expediente.getExpedientePartes() != null) {
            selectedExpedientePartes = new ArrayList<ExpedienteParte>(expediente.getExpedientePartes());
        }
        if (expediente != null && expediente.getInformes() != null) {
            selectedInformes = new ArrayList<Informe>(expediente.getInformes());
        }
        return null;
    }

	public boolean isCreateDialogVisible() {
        return createDialogVisible;
    }

	public void setCreateDialogVisible(boolean createDialogVisible) {
        this.createDialogVisible = createDialogVisible;
    }

	public String displayList() {
        createDialogVisible = false;
        findAllExpedientes();
        return "expediente";
    }

	public String displayCreateDialog() {
        expediente = new Expediente();
        createDialogVisible = true;
        return "expediente";
    }

	public String persist() {
        String message = "";
        if (expediente.getStrNumeroExpedienteId() != null) {
            expedienteService.updateExpediente(expediente);
            message = "Successfully updated";
        } else {
            expedienteService.saveExpediente(expediente);
            message = "Successfully created";
        }
        RequestContext context = RequestContext.getCurrentInstance();
        context.execute("createDialog.hide()");
        context.execute("editDialog.hide()");
        
        FacesMessage facesMessage = new FacesMessage(message);
        FacesContext.getCurrentInstance().addMessage(null, facesMessage);
        reset();
        return findAllExpedientes();
    }

	public String delete() {
        expedienteService.deleteExpediente(expediente);
        FacesMessage facesMessage = new FacesMessage("Successfully deleted");
        FacesContext.getCurrentInstance().addMessage(null, facesMessage);
        reset();
        return findAllExpedientes();
    }

	public void reset() {
        expediente = null;
        selectedDiligencias = null;
        selectedExpedientePartes = null;
        selectedInformes = null;
        createDialogVisible = false;
    }

	public void handleDialogClose(CloseEvent event) {
        reset();
    }
}
